package top.linuyx.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import top.linuyx.mapper.QueryProductsMapper;
import top.linuyx.pojo.entity.CommodityImageEntity;
import top.linuyx.pojo.vo.QueryProductsVO;
import top.linuyx.service.QueryProductsService;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author Cucumber
 * @Description：查询商品接口的具体实现
 * @Date Created in 2021-04-28 14:38
 */
@Service
public class QueryProductsServiceImpl implements QueryProductsService {

    @Autowired
    private QueryProductsMapper queryProductsMapper;

    /**
     * 接收用户输入的字符串并进行分词操作
     * @param msg
     * @return:分词后的字符串集合
     * @throws IOException
     */
    public List<String> cut(String msg) throws IOException {
        //创建一个读取字符串的流
        StringReader sr = new StringReader(msg);
        //开启智能分词
        IKSegmenter ik = new IKSegmenter(sr, true);
        Lexeme lex = null;
        //将分好后的若干个词存入集合
        List<String> list=new ArrayList<>();
        while((lex = ik.next()) != null){
            list.add(lex.getLexemeText());
        }
        return list;
    }

    /**
     * 从数据库中获取所有用户需要的商品信息并存入一个集合中
     * @return：商品信息集合
     */
    public List<QueryProductsVO> getProducts() {
        //创建商品信息集合
        List<QueryProductsVO> products = queryProductsMapper.getProducts();
        //创建图片信息集合
        List<CommodityImageEntity> images = queryProductsMapper.listImage();
        //遍历商品信息
        for (QueryProductsVO product : products) {
            //遍历图片信息
            for (CommodityImageEntity image : images) {
                //判断商品id是否与图片属性中的商品id相等
                //如果相等，则把图片信息插入到商品信息中的图片属性
                if (product.getCommodityId().equals(image.getCommodityId())) {
                    product.getImages().add(image.getName());
                }
            }
        }
        return products;
    }

    /**
     * 根据用户输入的字符串查询满足条件的商品。
     * 其中，在显示查询结果的时候，商品信息中满足用户输入的字会高亮显示
     * @param input:用户输入的字符串
     * @return：查询的商品信息结果集合
     * @throws IOException
     */
    @Override
    public List<QueryProductsVO> queryProducts(String input) throws IOException {
        //从数据库中获取所有商品信息存入集合
        List<QueryProductsVO> productsVOList = getProducts();
        
        if (input == null){
            return productsVOList;
        }

        //调用cut()方法把字符串拆分成多个词组并存入字符串集合
        List<String> stringList = cut(input);

        for (int i = 0; i < productsVOList.size(); i++) {
            for (int j = 0; j < stringList.size(); j++) {
                //判断商品信息中有没有不满足查询条件的商品，如果有的话，就把该商品从集合中删除
                if(productsVOList.get(i).getInformation().indexOf(stringList.get(j)) == -1){
                    productsVOList.remove(i);
                    i = -1;
                    break;
                }
            }
        }

        return productsVOList;

    }

}
